import http from 'http'
import { parse as queryParse } from 'querystring'
import { parse as urlParse } from 'url'

import { createPage } from './createPage/index.js'
import { connectToMySQL, getMySQLTables, getTableFullInfo } from './mysqlServer.js'

/**
 * 生成成功响应数据
 * @param {any} data - 响应的数据
 * @returns {Object} - 包含状态码、数据和消息的对象
 */
const successResponse = data => {
  return {
    code: 0,
    data,
    message: 'success',
  }
}

/**
 * 生成错误响应数据
 * @param {string} message - 错误消息
 * @returns {Object} - 包含状态码和错误消息的对象
 */
const errorResponse = message => {
  return {
    code: 500,
    message: message,
  }
}

/**
 * 处理获取 MySQL 数据库表信息的请求
 * @returns {Promise<Object>}
 */
const handleGeMySQLTables = async () => {
  // 调用 getMySQLTables 函数获取数据库表信息
  const tables = await getMySQLTables()
  return successResponse(tables)
}

/**
 * 处理获取指定表完整信息的请求
 * @param {Object} postParams - 包含请求参数的对象
 * @returns {Promise<Object>}
 */
const handleGetTableFullInfo = async postParams => {
  // 检查请求参数中是否包含 tableName
  if (!postParams.tableName) {
    return errorResponse('tableName不能为空')
  }
  // 调用 getTableFullInfo 函数获取指定表的完整信息
  const columns = await getTableFullInfo(postParams.tableName)
  return successResponse(columns)
}

/**
 * 处理创建页面的请求
 * @param {Object} postParams - 包含请求参数的对象
 * @returns {Promise<Object>}
 */
const handleCreatePage = async postParams => {
  // 检查请求参数中是否包含 namespace
  if (!postParams.namespace) {
    return errorResponse('namespace不能为空')
  }
  // 调用 createPage 函数创建页面
  await createPage(postParams)
  return successResponse()
}

/**
 * 默认处理方法
 * @param {Object} postParams - 包含请求参数的对象
 * @returns {Object}
 */
const handleDefault = postParams => {
  return {
    message: 'Hello, World!',
    status: 'success',
    postParams,
  }
}

// 创建 HTTP 服务器
const server = http.createServer(async (req, res) => {
  // 设置响应头，允许跨域请求
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization')
  // 设置响应内容类型为 JSON
  res.setHeader('Content-Type', 'application/json')
  // 设置响应状态码为 200
  res.statusCode = 200

  // 用于存储请求体数据的字符串
  let body = ''
  // 监听请求数据事件，将数据块追加到 body 中
  req.on('data', chunk => {
    body += chunk.toString()
  })

  // 等待请求数据接收完毕
  await new Promise(resolve => {
    req.on('end', resolve)
  })

  // 解析请求 URL
  const parsedUrl = urlParse(req.url, true)
  // 用于存储请求参数的对象
  let postParams = {}
  // 获取请求头中的 Content-Type
  const contentType = req.headers['content-type']

  // 如果请求方法为 POST
  if (req.method === 'POST') {
    if (contentType === 'application/json') {
      try {
        // 尝试解析 JSON 格式的请求体数据
        postParams = JSON.parse(body)
      } catch (error) {
        console.error('解析 JSON 格式的 request payload 时出错:', error)
        postParams = { error: 'Invalid JSON data' }
      }
    } else if (contentType === 'application/x-www-form-urlencoded') {
      // 解析 URL 编码的请求体数据
      postParams = queryParse(body)
    } else {
      postParams = { error: `Unsupported content type: ${contentType}` }
    }
  }

  // 用于存储响应数据的变量
  let responseData
  // 根据请求路径进行不同的处理
  switch (parsedUrl.pathname) {
    case '/api/getMySQLTables':
      responseData = await handleGeMySQLTables(postParams)
      break
    case '/api/getTableFullInfo':
      responseData = await handleGetTableFullInfo(postParams)
      break
    case '/api/createPage':
      responseData = await handleCreatePage(postParams)
      break
    default:
      responseData = await handleDefault(postParams)
  }

  // 将响应数据转换为 JSON 字符串
  const jsonString = JSON.stringify(responseData)
  // 发送响应数据
  res.end(jsonString)
})

/**
 * 初始化服务器
 */
const init = () => {
  // 连接到 MySQL 数据库
  connectToMySQL()
  // 服务器监听的端口号
  const port = 9001
  // 启动服务器监听指定端口
  server.listen(port, () => {
    console.log(`服务器正在监听端口 ${port}`)
  })
}

// 调用初始化函数
init()
